package cn.tedu.sp04.feign;

import cn.tedu.sp01.pojo.Item;
import cn.tedu.web.util.JsonResult;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;

import java.util.List;

/**
本类声明式客户端接口(远程调用接口)
三步配置：
1. 调用哪个模块
2. 调用哪个路径
3. 提交什么参数
 */
/*通过服务名从注册表得到该模块的服务器地址列表;完成调用那个模块*/
@FeignClient("item-service")
public interface ItemClient {
    /**
    spring mvc 注解@PathVariable/@PostMapping在这里启动作用是相反的作用
        - controller 响应客户端调用,接受参数
        - 客户端接口，向服务器发送调用,提交参数
     */

    /*根据订单id远程调用获取商品列表*/
    @GetMapping("/{orderId}")/*找到远程调用模块后设置调用哪个路径的方法*/
    /*@GetMapping("/{orderId}") String orderId将这个参数随同这个路径一起交给远程服务
    * 如果/{参数名}和参数名相同可以不用加@PathVariable("参数"),特指参数是赋予/{参数}
    * 但是如果setting->Build...->Java Compiler设置了编译时候没有保留参数名,则需要
    * 特指参数是赋予/{参数},再通过http:///...方法远程调用商品服务,
    * 返回来的结果是一个Json对象,大概是{code:200,msg:xxx,data:xxx}格式,
    * 这个Json对象可以自动还原成JsonResult<List<Item>>对象*/
    JsonResult<List<Item>> getItems(@PathVariable("orderId") String orderId);

    /*下单后减少商品库存
    * 本方法作为客户端通过http://...方法远程调用商品服务,返回来的结果是一个Json对象,
     * 大概是{code:200,msg:xxx,data:xxx}格式,这个Json对象可以自动还原成
     * JsonResult<List<Item>>对象*/
    @PostMapping("/decreaseNumber")/*找到远程调用模块后设置调用哪个路径的方法*/
    /*@RequestBody List<Item> items将商品信息群封装在协议体再交给远程服务,
    * 通过http://...方法远程调用商品服务,返回来的结果是一个Json对象,
    * 大概是{code:200,msg:xxx,data:xxx}格式,这个Json对象可以自动还原成
    * JsonResult<List<Item>>对象*/
    JsonResult<?> decreaseNumber(@RequestBody List<Item> items);
}
